package com.kk.gulimall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kk.common.utils.PageUtils;
import com.kk.common.utils.Query;
import com.kk.gulimall.product.dao.CategoryDao;
import com.kk.gulimall.product.entity.CategoryEntity;
import com.kk.gulimall.product.service.CategoryService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {

    // 可以注入 CategoryDao 操作, 也可以直接使用 baseMapper
    //@Autowired
    //private CategoryDao categoryDao;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<CategoryEntity> page = this.page (
                new Query<CategoryEntity> ( ).getPage (params),
                new QueryWrapper<CategoryEntity> ( )
        );

        return new PageUtils (page);
    }


    /**
     * 查出所有分类以及子分类，以树形结构组装起来
     */
    @Override
    public List<CategoryEntity> listWithTree() {

        // 1、查询出所有分类,null 查询所有
        List<CategoryEntity> entities = baseMapper.selectList (null);

        // 2、组装成父子树形结构
        // 2.1 查询出所有一级分类
        List<CategoryEntity> levelOneMenu = entities.stream ( ).filter (
                categoryEntity -> categoryEntity.getParentCid () == 0
        ).map (
                // 子菜单查询并映射
                menu -> {
                    // 通过 工具方法 获取所有分类 映射到 root 顶层菜单
                    menu.setChildren (getChildrens (menu, entities));
                    return menu;
                }
        ).sorted (
                // 所有返回的 子菜单排序（下面没有高亮，说明编码默认已经是这样排序）
                (menu1,menu2) -> (menu1.getSort ()==null?0:menu1.getSort ())
                        -(menu2.getSort ()==null?0:menu2.getSort ())
        ).collect (Collectors.toList ( ));

        // 2.2 查询出所有二级分类
        return levelOneMenu;
    }

    /**
     * 工具方法：递归查找所有菜单的子菜单(将所有分类过滤分配级别)
     *
     * @param root 父菜单
     * @param all  所有子菜单
     * @return
     */
    private List<CategoryEntity> getChildrens(CategoryEntity root, List<CategoryEntity> all) {
        List<CategoryEntity> children = all.stream ( ).filter (
                // 过滤：如果满足，所有子菜单的父菜单是 root
                categoryEntity -> categoryEntity.getParentCid ( ) == root.getCatId ( )
        ).map (
                // 查找子菜单并映射（递归）
                categoryEntity -> {
                    categoryEntity.setChildren (getChildrens (categoryEntity, all));
                    // 这边必须返回 无法省略，因为下面要排序
                    return categoryEntity;
                }
        ).sorted (
                // 菜单排序（实际默认就是如此，没高亮）
                (menu1,menu2) -> (menu1.getSort ()==null?0:menu1.getSort ())
                        -(menu2.getSort ()==null?0:menu2.getSort ())
        ).collect (Collectors.toList ( ));
        return children;
    }
}
